home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
159_01
/
verb.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-05-03
|
16KB
|
1,048 lines
/* VERB.C no mods for V 1.43 */
#include "advent.h"
/*
Routine to process a transitive verb
*/
VOID PASCAL trverb(VOID)
{
switch (verb)
{
case CALM:
case WALK:
case QUIT:
case SCORE:
case FOO:
case BRIEF:
case SUSPEND:
case HOURS:
case LOG:
actspk(verb);
break;
case TAKE:
vtake();
break;
case DROP:
vdrop();
break;
case OPEN:
case LOCK:
vopen();
break;
case SAY:
vsay();
break;
case NOTHING:
rspeak(54);
break;
case ON:
von();
break;
case OFF:
voff();
break;
case WAVE:
vwave();
break;
case KILL:
vkill();
break;
case POUR:
vpour();
break;
case EAT:
veat();
break;
case DRINK:
vdrink();
break;
case RUB:
if (object != LAMP)
rspeak(76);
else
actspk(RUB);
break;
case THROW:
vthrow();
break;
case FEED:
vfeed();
break;
case FIND:
case INVENTORY:
vfind();
break;
case FILL:
vfill();
break;
case READ:
vread();
break;
case BLAST:
vblast();
break;
case BREAK:
vbreak();
break;
case WAKE:
vwake();
break;
case SAVE:
saveadv();
describe();
descitem();
break;
case RESTORE:
restore();
describe();
descitem();
break;
default:
printf("This verb is not implemented yet.\n");
}
return;
}
/*
CARRY TAKE etc.
*/
VOID PASCAL vtake(VOID)
{
auto SHORT msg;
auto SHORT i;
if (toting(object))
{
actspk(verb);
return;
}
/* special case objects and fixed objects */
msg = 25;
if (object == PLANT && prop[PLANT] <= 0)
msg = 115;
if (object == BEAR && prop[BEAR] == 1)
msg = 169;
if (object == CHAIN && prop[BEAR] != 0)
msg = 170;
if (fixed[object])
{
rspeak(msg);
return;
}
/* special case for liquids */
if (object == WATER || object == OIL)
{
if (!here(BOTTLE) || liq() != object)
{
object = BOTTLE;
if (toting(BOTTLE) && prop[BOTTLE] == 1)
{
vfill();
return;
}
if (prop[BOTTLE] != 1)
msg = 105;
if (!toting(BOTTLE))
msg = 104;
rspeak(msg);
return;
}
object = BOTTLE;
}
if (holding >= 7)
{
rspeak(92);
return;
}
/* special case for bird. */
if (object == BIRD && prop[BIRD] == 0)
{
if (toting(ROD))
{
rspeak(26);
return;
}
if (!toting(CAGE))
{
rspeak(27);
return;
}
prop[BIRD] = 1;
}
if ((object == BIRD || object == CAGE) && prop[BIRD] != 0)
carry((BIRD + CAGE) - object, loc);
carry(object, loc);
/* handle liquid in bottle */
i = liq();
if (object == BOTTLE && i != 0)
place[i] = -1;
rspeak(54);
return;
}
/*
DROP etc.
*/
VOID PASCAL vdrop(VOID)
{
auto SHORT i;
/* check for dynamite */
if (toting(ROD2) && object == ROD && !toting(ROD))
object = ROD2;
if (!toting(object))
{
actspk(verb);
return;
}
/* snake and bird */
if (object == BIRD && here(SNAKE))
{
rspeak(30);
if (closed)
dwarfend();
dstroy(SNAKE);
prop[SNAKE] = -1;
}
else /* coins and vending machine */
{
if (object == COINS && here(VEND))
{
dstroy(COINS);
drop(BATTERIES, loc);
pspeak(BATTERIES, 0);
return;
}
else /* bird and dragon (ouch!!) */
{
if (object == BIRD && at(DRAGON) && prop[DRAGON] == 0)
{
rspeak(154);
dstroy(BIRD);
prop[BIRD] = 0;
if (place[SNAKE] != 0)
++tally2;
return;
}
}
}
/* Bear and troll */
if (object == BEAR && at(TROLL))
{
rspeak(163);
move(TROLL, 0);
move((TROLL + MAXOBJ), 0);
move(TROLL2, 117);
move((TROLL2 + MAXOBJ), 122);
juggle(CHASM);
prop[TROLL] = 2;
}
else /* vase */
{
if (object == VASE)
{
if (loc == 96)
rspeak(54);
else
{
prop[VASE] = at(PILLOW) ? 0 : 2;
pspeak(VASE, prop[VASE] + 1);
if (prop[VASE] != 0)
fixed[VASE] = -1;
}
}
}
/* handle liquid and bottle */
i = liq();
if (i == object)
object = BOTTLE;
if (object == BOTTLE && i != 0)
place[i] = 0;
/* handle bird and cage */
if (object == CAGE && prop[BIRD] != 0)
drop(BIRD, loc);
if (object == BIRD)
prop[BIRD] = 0;
drop(object, loc);
return;
}
/*
LOCK, UNLOCK, OPEN, CLOSE etc.
*/
VOID PASCAL vopen(VOID)
{
auto SHORT msg, oyclam;
switch (object)
{
case CLAM:
case OYSTER:
oyclam = (object == OYSTER ? 1 : 0);
if (verb == LOCK)
msg = 61;
else
{
if (!toting(TRIDENT))
msg = 122 + oyclam;
else
{
if (toting(object))
msg = 120 + oyclam;
else
{
msg = 124 + oyclam;
dstroy(CLAM);
drop(OYSTER, loc);
drop(PEARL, 105);
}
}
}
break;
case DOOR:
msg = (prop[DOOR] == 1 ? 54 : 111);
break;
case CAGE:
msg = 32;
break;
case KEYS:
msg = 55;
break;
case CHAIN:
if (!here(KEYS))
msg = 31;
else
{
if (verb == LOCK)
{
if (prop[CHAIN] != 0)
msg = 34;
else
if (loc != 130)
msg = 173;
else
{
prop[CHAIN] = 2;
if (toting(CHAIN))
drop(CHAIN, loc);
fixed[CHAIN] = -1;
msg = 172;
}
}
else
{
if (prop[BEAR] == 0)
msg = 41;
else
{
if (prop[CHAIN] == 0)
msg = 37;
else
{
prop[CHAIN] = 0;
fixed[CHAIN] = 0;
if (prop[BEAR] != 3)
prop[BEAR] = 2;
fixed[BEAR] = 2 - prop[BEAR];
msg = 171;
}
}
}
}
break;
case GRATE:
if (!here(KEYS))
msg = 31;
else
{
if (closing)
{
if (!panic)
{
clock2 = 15;
++panic;
}
msg = 130;
}
else
{
msg = 34 + prop[GRATE];
prop[GRATE] = (verb == LOCK ? 0 : 1);
msg += 2 * prop[GRATE];
}
}
break;
default:
msg = 33;
}
rspeak(msg);
return;
}
/*
SAY etc.
*/
VOID PASCAL vsay(VOID)
{
auto SHORT wtype, wval;
analyze(word1, &wtype, &wval);
printf("Okay.\n%s\n", wval == SAY ? word2 : word1);
return;
}
/*
ON etc.
*/
VOID PASCAL von(VOID)
{
if (!here(LAMP))
actspk(verb);
else
{
if (limit < 0)
rspeak(184);
else
{
prop[LAMP] = 1;
rspeak(39);
if (wzdark)
{
wzdark = 0;
describe();
descitem();
}
}
}
return;
}
/*
OFF etc.
*/
VOID PASCAL voff(VOID)
{
if (!here(LAMP))
actspk(verb);
else
{
prop[LAMP] = 0;
rspeak(40);
}
return;
}
/*
WAVE etc.
*/
VOID PASCAL vwave(VOID)
{
if (!toting(object) && (object != ROD || !toting(ROD2)))
rspeak(29);
else
{
if (object != ROD || !at(FISSURE) || !toting(object) || closing)
actspk(verb);
else
{
prop[FISSURE] = 1 - prop[FISSURE];
pspeak(FISSURE, 2 - prop[FISSURE]);
}
}
}
/*
ATTACK, KILL etc.
*/
VOID PASCAL vkill(VOID)
{
auto SHORT msg;
auto SHORT i;
switch (object)
{
case BIRD:
if (closed)
msg = 137;
else
{
dstroy(BIRD);
prop[BIRD] = 0;
if (place[SNAKE] == 19)
++tally2;
msg = 45;
}
break;
case 0:
msg = 44;
break;
case CLAM:
case OYSTER:
msg = 150;
break;
case SNAKE:
msg = 46;
break;
case DWARF:
if (closed)
dwarfend();
msg = 49;
break;
case TROLL:
msg = 157;
break;
case BEAR:
msg = 165 + (prop[BEAR] + 1) / 2;
break;
case DRAGON:
if (prop[DRAGON] != 0)
{
msg = 167;
break;
}
if (!yes(49, 0, 0))
break;
pspeak(DRAGON, 1);
prop[DRAG